import axios, { AxiosInstance } from 'axios'
import tools from './tools'

// 如果是在 vue-cli 或 create-react-app 脚手架项目中使用
// process.env.XXX 获得环境变量值
// 如果是在 vite 脚手架项目中使用
// import.meta.env.XXX 获取环境变量值

// const baseURL = import.meta.env.MODE === 'development' ? '' : 'http://162.14.108.31:5945'

// 保存所有未完成的网络请求
let requests: (() => void)[] = []
// 标记是否正在换取新的有效 token
let isFetching = false

// 创建实例
const service:AxiosInstance = axios.create({
  baseURL: import.meta.env.VITE_BASE_API,
  timeout: 10000,
  headers: {
    'Content-Type': 'application/x-www-form-urlencoded'
  }
})

/**
 * 请示拦截
 */
service.interceptors.request.use(
  config => {
    // 请示头中添加 token 的传递
    // const token = tools.getCookie('token')
    const token = sessionStorage.getItem('token')
    if (token) {
      config.headers.token = token
    }
    return config
  },
  error => Promise.reject(error), // 出现异常，可进行全局错误提示
)

/**
 * 响应拦截
 */
service.interceptors.response.use(
  response => {
    // 响应状态码为 2xx，表示成功
    if (response.status >= 200 && response.status < 300) {
      // 获取后端响应数据
      // return response.data.listr

      const { code, data, message } = response.data
      // console.log(response)
      console.log(response.data)
      // 判断后端响应数据的规范
      if (code === 200) {
        return data
      } if (code === 4008) {
        // 短token过期，实现无感刷新
        // 实现并发情况的token刷新，使用 promise 继续链式调用
        // return new Promise((resolve, reject) => {
        //   if (!isFetching) {
        //     isFetching = true
        //     // token 更新
        //     service.get('/api/v1/admin/sessions/refresh-token')
        //     .then((res: any) => {
        //       isFetching = false
        //       // console.log('token', res.token)

        //       // tools.setCookie('token', res.token, 60 * 60, '/')
        //       sessionStorage.setItem('token', res.token)
        //       requests.forEach((fn: any) => fn())
        //       // 清空 requests 数组
        //       requests = []
        //       resolve(service(response.config))
        //     })
        //     .catch((error: any) => {
        //       console.error(error)
        //       isFetching = false
        //       requests.forEach(fn => fn())
        //       requests = []
        //       // 处理 token 刷新失败的情况
        //       // ...
        //     })
        //   } else {
        //     requests.push(() => resolve(service(response.config)))
        //   }
        // })
      } if (code === 4009 || code === 4012) {
        // 长token过期，或者token非法
        // 清除 token
        // tools.setCookie('token', 1, -1, '/')
        // window.location.reload()
      }

      // 如果返回的 code 表示的是用户 token 异常的问题
      // 则通常前端会清除本地用户登录的状态信息，然后跳转到登录页面重新登录
      // TODO...
      // token异常处理情况

      // 其它问题，则进行全局错误提示
      return Promise.reject(message || '响应拦截时出现异常问题')
    }
    return null
  },
  error => Promise.reject(error), // 出现异常，可进行全局错误提示
)

export default service
